/* 
 * File:   InfoExtractWithoutMarker.cpp
 * Author: Henrique
 * 
 * Created on 26 de Outubro de 2011, 15:40
 */

#include "ExtratorDeInformacoesSemMarcadores.h"

ExtratorDeInformacoesSemMarcadores::ExtratorDeInformacoesSemMarcadores() {
}

ExtratorDeInformacoesSemMarcadores::ExtratorDeInformacoesSemMarcadores(const ExtratorDeInformacoesSemMarcadores& orig) {
}

ExtratorDeInformacoesSemMarcadores::~ExtratorDeInformacoesSemMarcadores() {
}

/*Conteudo* InfoExtractWithoutMarker::extrairInformacao(Estrutura* est, IplImage* dst) {
    vector<CvRect> quadriculas;
    quadriculas = formaQuadriculas(est->GetCampos());

    findAnswer(quadriculas, dst);


}*/


string ExtratorDeInformacoesSemMarcadores::extrairInformacao(Estrutura* est, IplImage* dst) {
    vector<CvRect> quadriculas;
    quadriculas = formaQuadriculas(est->GetCampos());

    return findAnswer(quadriculas, dst);


}

vector<CvRect> ExtratorDeInformacoesSemMarcadores::formaQuadriculas(vector<Campo*> campos) {
    vector<CvRect> rects;
        cout << "numero de campos"<< campos.size() << endl;
        string caminho = "C:/imgs/Gabaritos/Gabarito1.bmp";

   IplImage * teste = cvLoadImage("C:/imgs/Gabaritos/Gabarito1.bmp", 1);

   for (vector<Campo*>::iterator it = campos.begin(); it != campos.end(); ++it) {
       Campo* c = *it;
       rects.push_back(cvRect(c->GetCoordX(), c->GetCoordY(), c->GetLargura(), c->GetAltura()));
       CvScalar cor = cvScalar(0,0,256);
       CvPoint ponto1 = cvPoint(c->GetCoordX(), c->GetCoordY());
       CvPoint ponto2 =cvPoint(c->GetCoordX()+c->GetLargura(), c->GetCoordY()+c->GetAltura());
       cvDrawRect(teste, ponto1, ponto2, cor, CV_FILLED);
                                  // cvShowImage("Teste", teste);

    }
               cvWaitKey(10000);
                cout << "numero de rects"<< rects.size() << endl;

    return rects;
}

string ExtratorDeInformacoesSemMarcadores::findAnswer(vector<CvRect> quadriculas, IplImage * dst) {
    vector<CvRect>::iterator it = quadriculas.begin();
    stringstream s;
    s << "";
    int gambiarra = 1;
    int questao = 1;

    while (it != quadriculas.end()) {
        cvSetImageROI(dst, (*it));
        double value = Auxiliar::findNumberBlackPixels(dst, (*it).height, (*it).width);
        cvResetImageROI(dst);

        if ((gambiarra - 1) % 5 == 0) {
            s << endl;
            if (gambiarra % 2 != 0) {
                s << questao;
            } else {
                s << questao + 15;
            }
        }

#define A 75
#define B 65
#define C 40
#define D 68
#define E 63

        if (value >= A && gambiarra == 1) {
            s << "A";
        }
        if (value >= B && gambiarra == 2) {
            s << "B";
        }
        if (value >= C && gambiarra == 3) {
            s << "C";
        }
        if (value >= D && gambiarra == 4) {
            s << "D";
        }
        if (value >= E && gambiarra == 5) {
            s << "E";
        }
        if (value >= A && gambiarra == 6) {
            s << "A";
        }
        if (value >= B && gambiarra == 7) {
            s << "B";
        }
        if (value >= C && gambiarra == 8) {
            s << "C";
        }
        if (value >= D && gambiarra == 9) {
            s << "D";
        }
        if (value >= E && gambiarra == 10) {
            s << "E";
        }

        if (gambiarra == 5) {
            questao++;
        }

        gambiarra++;

        if (gambiarra > 10) {
            gambiarra = 1;
        }
        it++;
    }
    s << endl;
    return s.str();
}

string ExtratorDeInformacoesSemMarcadores::compareAnswers(const char * archieveFileName,
        const char * answerFileName) {
    ifstream archieve(archieveFileName);
    ifstream answer(answerFileName);

    int right = 0;
    int wrong = 0;

    char answerLine[200];
    char archieveLine[200];

    stringstream content;
    content << "";

    while (true) {
        if (answer.eof()) {
            break;
        }
        archieve.getline(archieveLine, 200);
        answer.getline(answerLine, 200);

        if (strcmp(answerLine, "") != 0) {
            content << "Imagem: " << answerLine << "\n";
        }

        while (strcmp(answerLine, "") != 0) {
            answer.getline(answerLine, 200);
            archieve.getline(archieveLine, 200);
            if (strcmp(answerLine, "") != 0) {
                if (strcmp(answerLine, archieveLine) == 0) {
                    right++;
                } else {
                    wrong++;
                    content << "      Resposta esperada: " << archieveLine
                            << "\n";
                    content << "      Resposta encontrada: " << answerLine
                            << "\n\n";
                }
            }
        }
        content << "\n";
    }
    archieve.close();
    answer.close();

    int total = right + wrong;
    double hitRate = 100 * ((double) right / (double) total);
    double errorRate = 100 * ((double) wrong / (double) total);

    content << "\nTotal de questões avaliadas: " << total << "\n";
    content << "   Questões corretas: " << right << "\n";
    content << "   Questões erradas: " << wrong << "\n \n \n";

    content << "Taxa de acerto: " << hitRate << "%\n";
    content << "Taxa de erro: " << errorRate << "%\n";

    return content.str();
}



